package uba.algo3.tp3.tsp;

import static org.junit.Assert.*;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.StringTokenizer;
import org.junit.Test;
/*import uba.algo3.tp2.ej2.Superficie;
import uba.algo3.tp2.ej2.Utils;*/

public class ExactoTest
{
	  static Grafo g;
	  ArrayList<Integer> costosEsperados = new ArrayList<Integer>(); //guardo, para cada instancia, el costo total que me deberia dar la solucion
	  
	  @Test
	  public void ExactoTest() throws IOException
	  {
	      costosEsperados.add(6);
	      costosEsperados.add(7);
	      costosEsperados.add(14);
	      costosEsperados.add(8);

	      int i = 0;
		  
		  BufferedReader is = new BufferedReader( new InputStreamReader( getClass().getResourceAsStream( "Tp3.in" ) ) );
	      BufferedWriter os = new BufferedWriter( new FileWriter( "Tp3Exacto.out" ) );
	  	  //BufferedWriter os = new BufferedWriter( new FileWriter( getClass().getResource( "" ).getPath() + "Tp3Exacto.out" ) ); //me tira FileNotFoundException!
	  	  
	      String line;

	      line = is.readLine();
	      
	      while(line != null)
	      {
	    	  leer(line,is);
		      
	    	  Exacto e = new Exacto(g);
		      Solucion s = e.get2TSP();
		      
		      escribir(s,os);
		      
		      assertEquals((Integer) costosEsperados.get(i), (Integer) s.getCosto());
		      
		      System.out.println("Costo Instancia " + (i+1) + ": " + s.getCosto());
		      
		      line = is.readLine(); //paso a la siguiente instancia
		      i++;
	      }
	      
		  os.close();
		  
	  }
	  
	  public void leer(String line, BufferedReader is) throws IOException{
			  
			  StringTokenizer st1 = new StringTokenizer(line, " ");
			  String cantNodos = st1.nextToken();
			  String nodoOrig_str = st1.nextToken();
				  
		      int n = Integer.parseInt(cantNodos);
			  int nodoOrig = Integer.parseInt(nodoOrig_str);
			  g = new Grafo(n, nodoOrig);
			  int temp;
			  
			  for(int i = 0; i < n-1; i++)
			  {
				  line = is.readLine();
				  st1 = new StringTokenizer(line, " ");
			      int j = i+1;
				  int k = 0;
				  while(st1.hasMoreTokens())
				  {
					  String s = st1.nextToken();
					  temp = Integer.parseInt(s);
					  g.matriz[k][j] = temp;
					  g.matriz[j][k] = temp;
					  k++;
				  }
			  }
	  }
		  
	  public void escribir(Solucion s, BufferedWriter os) throws IOException{
		      //escribo el archivo de salida
		      ArrayList<Integer> ciclo1 = s.getCiclo1();
		      String solCiclo1 = formatearSalida(ciclo1);
		      ArrayList<Integer> ciclo2 = s.getCiclo2();
		      String solCiclo2 = formatearSalida(ciclo2);
		      
		      os.append(solCiclo1);
		      os.newLine();
		      os.append(solCiclo2);
		      os.newLine();
	  }
		  
	  private String formatearSalida(ArrayList<Integer> a){
			  String res = new String();
			  a.remove(0); //le saco el nodo de origen
			  for(Integer e : a){
				  res+=e;
				  res+=" ";
			  }
			  return res;	
	  }

/*	   @Test
	   public void fileWritingRunTest() throws IOException {
	      // Con este test se lee el archivo de entrada proporcioando por la catedra 
	      // y se genera la salida.
	      
		   
	      BufferedReader is = new BufferedReader( new InputStreamReader( getClass().getResourceAsStream( "Tp3ExactoOptima.in" ) ) );
	  	  BufferedWriter os = new BufferedWriter( new FileWriter( "Tp3ExactoOptima.out" ) );

	      String line;
	      
	      
	      line = is.readLine();
	      
	      while(line != null)
	      {
			  StringTokenizer st1 = new StringTokenizer(line, " ");
			  String cantNodos = st1.nextToken();
			  String nodoOrig_str = st1.nextToken();
			  
			  int n = Integer.parseInt(cantNodos);
			  int nodoOrig = Integer.parseInt(nodoOrig_str);
			  g = new Grafo(n, nodoOrig);
			  int temp;
			  for(int i = 0; i < n-1; i++)
			  {
				  line = is.readLine();
				  
				  st1 = new StringTokenizer(line, " ");
				  int j = i+1;
				  int k = 0;
				  while(st1.hasMoreTokens())
				  {
					  String s = st1.nextToken();
					  temp = Integer.parseInt(s);
					  g.matriz[k][j] = temp;
					  g.matriz[j][k] = temp;
					  k++;
				  }
			  }
			  
		      Exacto e = new Exacto(g);
		      
		      Solucion s = e.get2TSP();
			  
		      //escribo el archivo de salida
		      ArrayList<Integer> ciclo1 = s.getCiclo1();
		      String solCiclo1 = formatearSalida(ciclo1);
		      ArrayList<Integer> ciclo2 = s.getCiclo2();
		      String solCiclo2 = formatearSalida(ciclo2);
		      
		      os.append(solCiclo1);
		      os.newLine();
		      os.append(solCiclo2);
		      os.newLine();

			  line = is.readLine();
	      }
	      
	      os.close();
	      
	   }

	  
	   @Test
	   public void fileTestingRunTest() throws IOException {
	      // Con este test se compara un archivo de entrada con el formato de la catedra 
	      // contra otro archivo con valores esperados.
	      BufferedReader source  = new BufferedReader( new InputStreamReader( getClass().getResourceAsStream( "Tp3.in" ) ) );
	      BufferedReader control = new BufferedReader( new InputStreamReader( getClass().getResourceAsStream( "Tp3.out" ) ) );
	      
	      String line;
	      while ( ( line = source.readLine() ) != null ) {
	         assertEquals( control.readLine(), run( line, source.readLine() ) );
	      }
	      
	   }

	   
	   private String run( String a, String b ) {
	      
	      int res = new Superficie(Utils.parseVallas(b),Integer.parseInt(a)).calcularSuperficieResguardada();
	      
	      return String.valueOf(res);
   	   }  
*/
	  
}
